
/**
 * 手写实现new的机制
 * 
 * 要完成一下几步：
 * 1.创建一个空对象
 * 2.将原型挂载到空对象上
 * 3.将创建的空对象作为this的载体
 * 4.执行构造函数代码
 * 5.如果return的是对象则返回对象,如果不是则返回创建的这个对象 
 */


function myNew(fn,...args){//构造函数以fn传入,构造函数的参数以...args传入
    //1.创建一个空的对象
    let obj = {};
    //2.将空对象的隐式原型指向构造函数的原型对象上
    // obj.__proto__ = fn.prototype; 不推荐这种方式挂载
    Object.setPrototypeOf(obj,fn.prototype);

    //将空对象作为this的载体，并执行构造函数
    const result = fn.apply(obj,args);

    //5.如果return的是对象则返回对象,如果不是则返回创建的这个对象
    return result instanceof Object ? result : obj;
}

//测试

function Person(name,age){
    this.name = name;  //this.xxx = value 等价于 obj.xxx = value 属性会被直接挂载到obj上
    this.age = age;
    return {
        name: '李四',
        age: 21
    }
}

let person = myNew(Person,'张三',20);
console.log(person);